package com.springboot.file.util.easyexcel.converter;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;

import java.math.BigDecimal;

/**
 * 自定义一个 BigDecimal 转换器，在转换前对 null 值进行特殊处理，例如将 null 值转换为 BigDecimal.ZERO。
 * 支持从STRING和NUMBER类型转换
 */
public class CustomBigDecimalConverter implements Converter<BigDecimal> {

    @Override
    public Class<BigDecimal> supportJavaTypeKey() {
        return BigDecimal.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        // 支持多种数据类型，注意：此处返回 null 表示都支持
        return null;
    }

    @Override
    public BigDecimal convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        // 根据单元格类型进行不同处理
        if (cellData.getType() == CellDataTypeEnum.NUMBER) {
            // 处理数字类型
            BigDecimal value = cellData.getNumberValue();
            if (ObjectUtil.isEmpty(value)) {
                return BigDecimal.ZERO;
            }
            return value;
        } else if (cellData.getType() == CellDataTypeEnum.STRING) {
            // 处理字符串类型
            String value = cellData.getStringValue();
            if (value == null || value.trim().isEmpty()) {
                return BigDecimal.ZERO;
            }
            try {
                return new BigDecimal(value.trim());
            } catch (NumberFormatException e) {
                // 类型不正确时抛出异常
                throw new IllegalArgumentException("无法将字符串 '" + value + "' 转换为 BigDecimal");
            }
        } else {
            // 类型不正确时抛出异常
            throw new IllegalArgumentException("不支持的单元格数据类型：" + cellData.getType());
        }
    }

    @Override
    public WriteCellData<?> convertToExcelData(BigDecimal value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        return new WriteCellData<>(value == null ? "" : value.toString());
    }
}